package com.comtop.topcloud.device.util;

import java.util.Arrays;

public class StringUtils {

    /**
     * 将下划线分隔的字符串转换为驼峰形式
     *
     * @param underscored 下划线分隔的字符串
     * @return 转换后的驼峰形式字符串
     */
    public static String toCamelCase(String underscored) {
        if (underscored == null || underscored.isEmpty()) {
            return underscored;
        }

        StringBuilder camelCase = new StringBuilder();
        String[] parts = underscored.split("_");
        parts = Arrays.stream(parts).filter(part -> !part.isEmpty()).toArray(String[]::new);
        for (int i = 0; i < parts.length; i++) {
            String part = parts[i];
            if (i == 0) {
                // 第一个单词的首字母小写
                camelCase.append(part.toLowerCase());
            } else {
                // 后续单词的首字母大写
                camelCase.append(capitalize(part));
            }
        }
        return camelCase.toString();
    }

    /**
     * 将字符串的首字母大写
     *
     * @param str 要处理的字符串
     * @return 首字母大写的字符串
     */
    private static String capitalize(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        return str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase();
    }


    public static String generateRedisKey(String... parts) {
        if (parts == null || parts.length == 0) {
            return "";
        }

        // 使用 StringBuilder 拼接各个参数，避免频繁创建新的字符串对象
        StringBuilder sb = new StringBuilder();

        // 预估字符串拼接的长度
        int estimatedLength = 0;
        for (String part : parts) {
            if (part != null) {
                estimatedLength += part.length();
            }
        }
        estimatedLength += (parts.length - 1) * 1; // 每个分隔符占 1 个字符

        sb.ensureCapacity(estimatedLength);  // 设置 StringBuilder 的初始容量

        // 将第一个元素直接加到 StringBuilder 中
        sb.append(parts[0]);

        // 从第二个参数开始，依次拼接，每个参数之间用冒号分隔
        for (int i = 1; i < parts.length; i++) {
            sb.append(":").append(parts[i]);
        }

        return sb.toString();
    }

}